home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 101-125 / 118 / empire / src / source.zoo / messages.d < prev    next >
Text File  |  1987-12-02  |  14KB  |  542 lines

  1. #include:util.g
  2. #empire.g
  3. #empfunc.g
  4.  
  5. [range(NewsType_t)] ushort NEWS_PAGE = (
  6.     3,1,1,2,2,3,3,3,3,2,1,1,2,1,1,2,1,1,1,1,1,3,2,1,1,1,1,1,1,1,1,2,2,1,1,2,1
  7. );
  8. [range(NewsType_t)] short NEWS_GOOD_WILL = (
  9.     0, -3, -3, -1, 1, 3, 2, 1, 0, 2, -2, -2, 0, 0, 0, 0, -2, -2, -2,
  10.     -3, -1, -2, -1, -4, 0, 0, 5, 0, -5, -5, 5, 0, 0, 0, 0, 0, -2
  11. );
  12.  
  13. proc cmd_telegram()void:
  14.     *char fileName, q;
  15.     uint country;
  16.     char ch, prevCh, prevPrevCh;
  17.     channel input text chin;
  18.     file() fyle;
  19.     ushort stat;
  20.     bool cancel, broadCast;
  21.  
  22.     cancel := false;
  23.     broadCast := false;
  24.     if InputPtr* = '*' and ThisCountryNumber = DEITY then
  25.     InputPtr := InputPtr + 1;
  26.     skipBlanks();
  27.     broadCast := true;
  28.     pretend(FileDestroy(".telegram"), void);
  29.     if FileCreate(".telegram") then
  30.         if not open(TelegramChannel, fyle, ".telegram") then
  31.         err("can't open .telegram for writing");
  32.         cancel := true;
  33.         fi;
  34.     else
  35.         err("can't create .telegram");
  36.         cancel := true;
  37.     fi;
  38.     elif not reqCountry(&country, "Country to send telegram to: ") then
  39.     cancel := true;
  40.     fi;
  41.     if not cancel then
  42.     if InputPtr* = '\e' then
  43.         writeln(Chout; "Enter text of telegram. End with ^\\ or .:");
  44.         writeln(Chout;);
  45.         if UsingSerial then
  46.         open(chin, serialGetChar);
  47.         else
  48.         open(chin);
  49.         fi;
  50.     elif UsingSerial then
  51.         err("Can't telegram from file when using remote access");
  52.         cancel := true;
  53.     else
  54.         fileName := InputPtr;
  55.         skipWord();
  56.         q := InputPtr;
  57.         skipBlanks();
  58.         q* := '\e';
  59.         if not open(chin, fyle, fileName) then
  60.         writeln(Chout; "*** Can't open file '", fileName, "' ***");
  61.         cancel := true;
  62.         fi;
  63.     fi;
  64.     if not cancel then
  65.         if not broadCast then
  66.         telegramStart(ThisCountryNumber, country);
  67.         fi;
  68.         while
  69.         prevCh := '\e';
  70.         ch := '\e';
  71.         while
  72.             prevPrevCh := prevCh;
  73.             prevCh := ch;
  74.             read(chin; ch)
  75.         do
  76.             if ch < ' ' and ch ~= '\t' or ch > '~' then
  77.             ch := '?';
  78.             fi;
  79.             if prevCh ~= '\e' then
  80.             write(TelegramChannel; prevCh);
  81.             fi;
  82.         od;
  83.         if prevPrevCh = '\e' and prevCh = '.' then
  84.             false
  85.         else
  86.             if ioerror(chin) = CH_MISSING then
  87.             if prevCh ~= '\e' then
  88.                 write(TelegramChannel; prevCh);
  89.             fi;
  90.             writeln(TelegramChannel;);
  91.             not UsingSerial or not serialHungup()
  92.             else
  93.             false
  94.             fi
  95.         fi
  96.         do
  97.         readln(chin;);
  98.         od;
  99.         close(chin);
  100.         writeln(Chout;);
  101.         if broadCast then
  102.         close(TelegramChannel);
  103.         for country from 0 upto World.w_currCountries - 1 do
  104.             writeln(Chout; "Sending telegram to ",
  105.                 &Country[country].c_name[0]);
  106.             if open(chin, fyle, ".telegram") then
  107.             telegramStart(ThisCountryNumber, country);
  108.             while
  109.                 while read(chin; ch) do
  110.                 write(TelegramChannel; ch);
  111.                 od;
  112.                 ioerror(chin) = CH_MISSING
  113.             do
  114.                 writeln(TelegramChannel;);
  115.                 readln(chin;);
  116.             od;
  117.             telegramEnd();
  118.             close(chin);
  119.             else
  120.             err("Can't open .telegram for reading");
  121.             fi;
  122.         od;
  123.         pretend(FileDestroy(".telegram"), void);
  124.         else
  125.         telegramEnd();
  126.         news(n_sent_telegram, ThisCountryNumber, country);
  127.         fi;
  128.     fi;
  129.     fi;
  130. corp;
  131.  
  132. /*
  133.  * telegramCheck - called to check for new telegrams.
  134.  */
  135.  
  136. proc telegramCheck()void:
  137.  
  138.     if ThisCountry*.c_telegramsNew ~= 0 then
  139.     writeln(Chout; "You have old telegrams.");
  140.     fi;
  141.     if ThisCountry*.c_telegramsNew ~= ThisCountry*.c_telegramsTail then
  142.     writeln(Chout; "You have new telegrams.");
  143.     fi;
  144. corp;
  145.  
  146. proc cmd_read()void:
  147.  
  148.     if ThisCountry*.c_telegramsTail = 0 then
  149.     writeln(Chout; "No telegrams");
  150.     else
  151.     telegramOpen();
  152.     while telegramRead(ThisCountry*.c_telegramsTail) do
  153.     od;
  154.     if ask("Delete these telegrams? ") then
  155.         ThisCountry*.c_telegramsNew := 0;
  156.         ThisCountry*.c_telegramsTail := 0;
  157.     else
  158.         ThisCountry*.c_telegramsNew := ThisCountry*.c_telegramsTail;
  159.     fi;
  160.     fi;
  161. corp;
  162.  
  163. /*
  164.  * sayHeadLine - report on a headline item.
  165.  */
  166.  
  167. proc sayHeadLine(int recent, past; *char actor, victim)void:
  168.     *char message;
  169.  
  170.     message :=
  171.     case
  172.         if | past > | recent then 1 else 0 fi +
  173.         if past >= 0 then 2 else 0 fi +
  174.         if recent >= 0 then 4 else 0 fi
  175.     incase 0:
  176.         "Carnage being wreaked by $ on $ continues unabated!"
  177.     incase 1:
  178.         if recent < -10 then
  179.         "Further $ agression against $"
  180.         else
  181.         "Peace talks may succeed between $ & $"
  182.         fi
  183.     incase 2:
  184.         if recent < -12 then
  185.         if past > 8 then
  186.             "! WAR !  A complete reversal of prior $ -- $ relations"
  187.         else
  188.             if recent < -20 then
  189.             "$ wreaks havoc on $!"
  190.             else
  191.             "VIOLENCE ERUPTS! -- $ wages war on $"
  192.             fi
  193.         fi
  194.         else
  195.         "Breakdown in communication between $ & $"
  196.         fi
  197.     incase 3:
  198.         if past > 10 then
  199.         "FLASH!   $ turns on former ally, $"
  200.         else
  201.         "$ aggravates rift with $"
  202.         fi
  203.     incase 4:
  204.         if recent > 10 then
  205.         "$ enters new era of cooperation with $"
  206.         else
  207.         "$ \"makes friends\" with $"
  208.         fi
  209.     incase 5:
  210.         if recent > 5 then
  211.         "$ willing to bury the hatchet with $"
  212.         else
  213.         if past < -16 then
  214.             "Tensions ease as $ attacks on $ seem at an end"
  215.         else
  216.             "$ seems to have forgotten earlier disagreement with $"
  217.         fi
  218.         fi
  219.     incase 6:
  220.         "$ good deeds further growing alliance with $"
  221.     incase 7:
  222.         if recent - past < -20 then
  223.         "Honeymoon appears to be over between $ & $"
  224.         else
  225.         "Friendly relations between $ & $ have cooled somewhat"
  226.         fi
  227.     default:
  228.         "***unknown headline***"
  229.     esac;
  230.     while message* ~= '\e' do
  231.     if message* = '$' then
  232.         write(Chout; actor);
  233.         actor := victim;
  234.     else
  235.         write(Chout; message*);
  236.     fi;
  237.     message := message + sizeof(char);
  238.     od;
  239.     writeln(Chout;);
  240. corp;
  241.  
  242. /*
  243.  * doHeadLines - generate headlines for the given number of days of news.
  244.  */
  245.  
  246. proc doHeadLines(uint days)void:
  247.     type
  248.     history_t = struct {
  249.         int h_past, h_recent;
  250.     };
  251.     News_t n;
  252.     ulong now, time;
  253.     [COUNTRY_MAX, COUNTRY_MAX] history_t hist;
  254.     *history_t h;
  255.     int goodWill;
  256.     uint i, j, scoopI, scoopJ, scoop, day, scoopCount;
  257.     bool hadOne;
  258.  
  259.     now := CurrentTime();
  260.     writeln(Chout;);
  261.     writeln(Chout; "        -=[  EMPIRE NEWS  ]=-");
  262.     writeln(Chout; "::::::::::::::::::::::::::::::::::::::::::::::::::");
  263.     writeln(Chout; "!       \"All the news that fits, we print.\"      !");
  264.     writeln(Chout; "::::::::::::::::::::::::::::::::::::::::::::::::::");
  265.     write(Chout; "       ");
  266.     writeDate(now);
  267.     writeln(Chout;);
  268.     printFile(BULLETIN_FILE);
  269.     for i from 0 upto COUNTRY_MAX - 1 do
  270.     for j from 0 upto COUNTRY_MAX - 1 do
  271.         hist[i, j].h_past := 0;
  272.         hist[i, j].h_recent := 0;
  273.     od;
  274.     od;
  275.     time := now - make(days - 1, ulong) * (60 * 60 * 24);
  276.     day := 0;
  277.     hadOne := false;
  278.     while hadOne or day ~= days do
  279.     if not hadOne then
  280.         if newsOpen(time) then
  281.         hadOne := newsNext(n);
  282.         else
  283.         hadOne := false;
  284.         fi;
  285.         day := day + 1;
  286.         time := time + (60 * 60 * 24);
  287.     else
  288.         hadOne := newsNext(n);
  289.     fi;
  290.     if hadOne and n.n_actor ~= n.n_victim then
  291.         goodWill := NEWS_GOOD_WILL[n.n_verb];
  292.         if goodWill ~= 0 then
  293.         h := &hist[n.n_actor, n.n_victim];
  294.         if n.n_time - now > days * (60 * 60 * 12) then
  295.             h*.h_past := h*.h_past + 1;
  296.         else
  297.             h*.h_recent := h*.h_recent + 1;
  298.         fi;
  299.         fi;
  300.     fi;
  301.     od;
  302.     scoopCount := 0;
  303.     while
  304.     scoop := 9;
  305.     for i from 0 upto COUNTRY_MAX - 1 do
  306.         for j from 0 upto COUNTRY_MAX - 1 do
  307.         h := &hist[i, j];
  308.         goodWill := | h*.h_recent / 2;
  309.         if make(goodWill, uint) > scoop then
  310.             scoop := goodWill;
  311.             scoopI := i;
  312.             scoopJ := j;
  313.         fi;
  314.         goodWill := | (h*.h_recent - h*.h_past);
  315.         if make(goodWill, uint) > scoop then
  316.             scoop := goodWill;
  317.             scoopI := i;
  318.             scoopJ := j;
  319.         fi;
  320.         od;
  321.     od;
  322.     writeln(Chout;);
  323.     scoop > 9 and scoopCount < 5
  324.     do
  325.     scoopCount := scoopCount + 1;
  326.     h := &hist[scoopI, scoopJ];
  327.     sayHeadLine(h*.h_recent, h*.h_past,
  328.             &Country[scoopI].c_name[0], &Country[scoopJ].c_name[0]);
  329.     h*.h_recent := 0;
  330.     h*.h_past := 0;
  331.     h := &hist[scoopJ, scoopI];
  332.     goodWill := h*.h_recent - h*.h_past;
  333.     if goodWill <= -make(scoop / 2, int) or
  334.         goodWill >= make(scoop / 2, int) then
  335.         writeln(Chout;
  336.             case goodWill % 4
  337.             incase 0:
  338.             "        Meanwhile"
  339.             incase 1:
  340.             "        On the other hand"
  341.             incase 2:
  342.             "        At the same time"
  343.             incase 3:
  344.             "        Although"
  345.             esac);
  346.         sayHeadLine(h*.h_recent, h*.h_past,
  347.             &Country[scoopJ].c_name[0],
  348.             &Country[scoopI].c_name[0]);
  349.         h*.h_recent := 0;
  350.         h*.h_past := 0;
  351.     fi;
  352.     od;
  353.     if scoopCount = 0 then
  354.     writeln(Chout; "Relative calm prevails.");
  355.     fi;
  356. corp;
  357.  
  358. proc cmd_headlines()void:
  359.     int i;
  360.  
  361.     if InputPtr* = '\e' then
  362.     doHeadLines(1);
  363.     elif getNumber(&i) and i > 0 then
  364.     doHeadLines(i);
  365.     else
  366.     err("invalid day count");
  367.     fi;
  368. corp;
  369.  
  370. /*
  371.  * sayNews - report an item of news, and how many times it happened.
  372.  */
  373.  
  374. proc sayNews(NewsType_t verb; ushort actor, victim; ulong time;uint count)void:
  375.     *char v;
  376.  
  377.     writeDate(time);
  378.     write(Chout; ": ", &Country[actor].c_name[0], ' ');
  379.     v := &Country[victim].c_name[0];
  380.     case verb
  381.     incase n_nothing:
  382.     write(Chout; "did nothing in particular to ", v);
  383.     incase n_won_sector:
  384.     write(Chout; "won a sector from ", v);
  385.     incase n_lost_sector:
  386.     write(Chout; "was repulsed by ", v);
  387.     incase n_spy_shot:
  388.     write(Chout; "had a spy shot by ", v);
  389.     incase n_sent_telegram:
  390.     write(Chout; "sent a telegram to ", v);
  391.     incase n_sign_treaty:
  392.     write(Chout; "signed a treaty with ", v);
  393.     incase n_make_loan:
  394.     write(Chout; "made a loan to ", v);
  395.     incase n_repay_loan:
  396.     write(Chout; "repaid a loan from ", v);
  397.     incase n_make_sale:
  398.     write(Chout; "made a sale to ", v);
  399.     incase n_grant_sector:
  400.     write(Chout; "granted land to ", v);
  401.     incase n_shell_sector:
  402.     write(Chout; "shelled land owned by ", v);
  403.     incase n_shell_ship:
  404.     write(Chout; "shelled a ship owned by ", v);
  405.     incase n_took_unoccupied:
  406.     write(Chout; "took over unoccupied land");
  407.     incase n_torp_ship:
  408.     write(Chout; "had a ship torpedoed");
  409.     incase n_fire_back:
  410.     write(Chout; "fired on ", v, " in self defense");
  411.     incase n_broke_sanctuary:
  412.     write(Chout; "broke sanctuary");
  413.     incase n_bomb_sector:
  414.     write(Chout; "bombed one of ", v, "'s sectors");
  415.     incase n_bomb_ship:
  416.     write(Chout; "bombed a ship flying the flag of ", v);
  417.     incase n_board_ship:
  418.     write(Chout; "boarded a(n) ", v, " ship");
  419.     incase n_failed_board:
  420.     write(Chout; "was repelled by ", v,
  421.           " while attempting to board a ship");
  422.     incase n_flak:
  423.     write(Chout; "fired on ", v, " aircraft");
  424.     incase n_sieze_sector:
  425.     write(Chout; "siezed a sector from ", v,
  426.           " in collecting on a loan");
  427.     incase n_honor_treaty:
  428.     write(Chout;
  429.           "considered an action which would have violated a treaty with",
  430.           v);
  431.     incase n_violate_treaty:
  432.     write(Chout; "violated a treaty with ", v);
  433.     incase n_dissolve:
  434.     write(Chout; "dissolved its government");
  435.     incase n_hit_mine:
  436.     write(Chout; "ship hit a mine");
  437.     incase n_decl_ally:
  438.     write(Chout; "announced an alliance with ", v);
  439.     incase n_decl_neut:
  440.     write(Chout; "declared their neutrality toward ", v);
  441.     incase n_decl_war:
  442.     write(Chout; "declared WAR on ", v);
  443.     incase n_disavow_ally:
  444.     write(Chout; "disavowed former alliance with ", v);
  445.     incase n_disavow_war:
  446.     write(Chout; "disavowed former war with ", v);
  447.     incase n_storm_sector:
  448.     write(Chout; "sector damaged by hurricane");
  449.     incase n_storm_ship:
  450.     write(Chout; "navy sufferred hurricane damages");
  451.     incase n_plague_outbreak:
  452.     write(Chout; "reports outbreak of PLAGUE");
  453.     incase n_plague_die:
  454.     write(Chout; "citizens killed by PLAGUE");
  455.     incase n_name_change:
  456.     write(Chout; "went through a name change");
  457.     incase n_drop_sub:
  458.     write(Chout; "depth charged a(n) ", v, " submarine");
  459.     default:
  460.     write(Chout; "***unknown news type***");
  461.     esac;
  462.     if count ~= 1 then
  463.     write(Chout; ' ', count, " times");
  464.     fi;
  465.     writeln(Chout;);
  466. corp;
  467.  
  468. proc cmd_newspaper()void:
  469.     News_t n;
  470.     ulong now, start, time, prevTime;
  471.     int i;
  472.     uint days, page, day, count;
  473.     NewsType_t prevVerb;
  474.     ushort prevActor, prevVictim;
  475.     bool quit, hadOne;
  476.  
  477.     quit := false;
  478.     if InputPtr* = '\e' then
  479.     days := 1;
  480.     elif getNumber(&i) and i > 0 then
  481.     days := i;
  482.     else
  483.     err("invalid day count");
  484.     quit := true;
  485.     fi;
  486.     if not quit then
  487.     doHeadLines(days);
  488.     now := CurrentTime() / (60 * 60 * 24) * (60 * 60 * 24);
  489.     start := now - make(days - 1, ulong) * (60 * 60 * 24);
  490.     writeln(Chout;);
  491.     write(Chout; "The details of Empire news since ");
  492.     writeDate(start);
  493.     writeln(Chout;);
  494.     for page from 1 upto 3 do
  495.         writeln(Chout;);
  496.         writeln(Chout; "        === page ", page, " ===");
  497.         prevVerb := n_nothing;
  498.         prevActor := DEITY;
  499.         prevVictim := DEITY;
  500.         count := 0;
  501.         time := start;
  502.         day := 0;
  503.         hadOne := false;
  504.         while hadOne or day ~= days do
  505.         if not hadOne then
  506.             if newsOpen(time) then
  507.             hadOne := newsNext(n);
  508.             else
  509.             hadOne := false;
  510.             fi;
  511.             day := day + 1;
  512.             time := time + (60 * 60 * 24);
  513.         else
  514.             hadOne := newsNext(n);
  515.         fi;
  516.         if hadOne then
  517.             if NEWS_PAGE[n.n_verb] = page then
  518.             if n.n_verb ~= prevVerb or n.n_actor ~= prevActor or
  519.                 n.n_victim ~= prevVictim then
  520.                 if count ~= 0 then
  521.                 sayNews(prevVerb, prevActor, prevVictim,
  522.                     prevTime, count);
  523.                 fi;
  524.                 count := 1;
  525.                 prevVerb := n.n_verb;
  526.                 prevActor := n.n_actor;
  527.                 prevVictim := n.n_victim;
  528.                 prevTime := n.n_time;
  529.             else
  530.                 count := count + 1;
  531.             fi;
  532.             fi;
  533.         fi;
  534.         od;
  535.         if count ~= 0 then
  536.         sayNews(prevVerb, prevActor, prevVictim, prevTime, count);
  537.         fi;
  538.     od;
  539.     writeln(Chout;);
  540.     fi;
  541. corp;
  542.